package com.thinking.in.spring.ioc.dependency.injection;

import com.think.in.spring.ioc.overview.domain.User;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;

/**
 * 依赖注入 - 构造器注入 ：
 *          1 . xml 的方式
 *          2 . 注解的方式
 *          3 . Api的方式
 *
 * @author zjiajia
 * @date 2021/12/31 13:17
 */
public class AnnotationDependencyConstructInjectionDemo {

    public static void main(String[] args) {
        // 创建 BeanFactory
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();

        // xml Bean定义信息 Reader
        XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(applicationContext);
        // 加载配置信息  ，解析 装载 配置文件
        xmlBeanDefinitionReader.loadBeanDefinitions("classpath:/META-INF/dependency-lookup-context.xml");

        // 注册 configuration Class (配置类)
        applicationContext.register(AnnotationDependencyConstructInjectionDemo.class);

        // 启动Spring 应用上下文
        applicationContext.refresh();

        // 注解形式的注入的时候，也是可以用 XmlBean的配置信息的，都是将Bean信息加载到了 BeanDefinitionRegister中了
        UserHolder userHolder = applicationContext.getBean("userHolder", UserHolder.class);

        System.out.println(userHolder);


        // 关闭应用上下文
        applicationContext.close();


    }

    /**
     * 注解的形式 ： 首先拿到 UserHolder Bean
     *      让后将 User 作为参数传入
     * @param user      user
     * @return          userHolder
     */
    @Bean
    public UserHolder userHolder(User user){

        return new UserHolder(user);
    }
}
